#ifndef MYDATA_H
#define MYDATA_H
/*************************************************
 *	文件名称：mydata.h
 *	文件说明：	定义了单链表结构
				1.分配由值为e的结点的函数
				2.释放p所指向的结点
				3.构造一个空的线性表
				4.为线性链表填充元素
				5.销毁线性链表
				6.将线性链表L重置为空表
				7.结点插入函数
				8.删除链表中的第一个结点
				9.在线性表L的最后一个结点增加结点
				10.删除线性链表L中的尾结点并且以q返回
				11.将s所指结点插入在结点p所指结点之前
				12.将s所指结点插入在结点p所指结点之后
				13.用e更新p所指结点中数据元素的值
				14.返回p所指结点中的元素数据的值
				15.判断线性链表L是否为空表
				16.获取线性链表L中元素个数
				17.获取线性链表L中头结点位置
				18.获取线性链表L中尾结点位置
				19.p所指结点的直接前驱位置
				20.p所指结点的直接后继位置
				21.p指向线性链表L中第i个结点的位置
				22.线性链表L中第一个与e满足函数compare()判定关系的元素的位置
				23.依次对L的每个元素调用visit()
				24.算法2.20 在带头结点的单链线性表L的第i个元素之前插入元素e
				25.算法2.21 将两个有序链表合并为一个有序链表
 *	程序平台：for linux
 *	文件作者：Jason <jasonsunsoft@163.com>
 *	文件时间：2014年8月23日 20:43
*************************************************/

#include <stdlib.h>
#include <stdio.h>
#include "../../../common.h"



/*
typedef struct {
	int a;
}ElemType;*/
typedef int ElemType;

//指针描述线性链表
typedef struct LNode{		//结点类型
	ElemType data;			//节点数据
	struct LNode * next;	//下个节点地址
} LNode,*Link, *Position;

typedef struct {
	Link head, tail;		//分别指向线性表中的头结点和最后一个结点
	int len;				//指示线性表中数据的个数
}LinkList;



//-------------- 基本操作的函数说明---------------

Status MakeNode(Link *p, ElemType e);
// 分配由p指向的值为e的结点，并返回OK；若分配失败，则返回ERROR

void FreeNode(Link p);
// 释放p所指向的结点



Status InitList(LinkList *L);
//构造一个空的线性表

Status ImportElem(LinkList *L, int n);
//为线性链表填充元素

Status DestroyList(LinkList *L);
//销毁线性链表L，L不再存在

Status ClearList(LinkList *L);
//将线性链表L重置为空表，并释放原链表的结点空间

Status InsFirst(Link h, Link s);
//已知h指向线性链表的头结点，将s所指结点插入在第一个节点之前

Status DelFirst(Link h, Link *q);
//已知h指向线性链表的头结点，删除链表中的第一个结点并以q返回

Status Append(LinkList *L, Link s);
//将指针s所指（彼此以指针相连）的一串结点链表在线性表L的最后一个结点
//之后，并改变链表L的尾指针指向新的尾结点

Status Remove(LinkList *L, Link *q);
//删除线性链表L中的尾结点并且以q返回，改变链表L的尾指针指向新的尾结点

Status InsBefore(LinkList *L, Link *p, Link s);
//已知p指向线性链表L中的一个结点，将s所指结点插入在结点p所指结点之前，并修改指针p指向新结点

Status InsAfter(LinkList *L, Link *p, Link s);
//已知p指向线性链表L中的一个结点，将s所指结点插入在结点p所指结点之后，并修改指针p指向新结点

Status SetCurElem(Link *p, ElemType e);
//已知p指向线性链表中的一个结点，用e更新p所指结点中数据元素的值

ElemType GetCurElem(Link p);
//已知p指向线性链表中的一个结点，返回p所指结点中的元素数据的值

Status ListEmpty(LinkList L);
//若线性链表L为空表，则返回TRUE，否则返回FALSE

int ListLength(LinkList L);
//返回线性链表L中元素个数

Position GetHead(LinkList L);
//返回线性链表L中头结点位置

Position GetLast(LinkList L);
//返回线性链表L中尾结点位置

Position PriorPos(LinkList L, Link p);
//已知p指向线性链表L中的一个结点，返回p所指结点的直接前驱位置，若无前驱，则返回NULL

Position NextPos(LinkList L, Link p);
//已知p指向线性链表L中的一个结点，返回p所指结点的直接后继位置，若无后继，则返回NULL

Status LocatePos(LinkList L, int i, Link *p);
//返回p指向线性链表L中第i个结点的位置并返回OK，i值不合法时返回ERROR

Position LocateElem(LinkList L, ElemType e, Status (*compare)(ElemType, ElemType));
//返回线性链表L中第一个与e满足函数compare()判定关系的元素的位置，若不存在这样的元素，则返回NULL

Status ListTraverse(LinkList L,Status(*visit)(Position));
//依次对L的每个元素调用visit()。一旦visit()失败，则操作失败。


Status ListInsert_L(LinkList *L, int i, ElemType e);
//算法2.20 在带头结点的单链线性表L的第i个元素之前插入元素e


Status MergelList_L(LinkList *La, LinkList *Lb, LinkList *Lc, Status (*compare)(ElemType, ElemType));
//算法2.21 将两个有序链表合并为一个有序链表

Status PriElem(Position p);
//打印元素值

Status Les(ElemType e1, ElemType e2);
//小于

#endif //MYDATA_H
